package com.powernode.customer.service.impl;

import com.powernode.common.constant.RedisConstant;
import com.powernode.common.execption.PowerException;
import com.powernode.common.result.Result;
import com.powernode.customer.client.CustomerInfoFeignClient;
import com.powernode.customer.service.CustomerService;
import com.powernode.model.form.customer.UpdateWxPhoneForm;
import com.powernode.model.vo.customer.CustomerLoginVo;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.UUID;

/**
 * 客户服务实现类，实现CustomerService接口
 */
@Slf4j
@Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class CustomerServiceImpl implements CustomerService {
    // 注入客户信息Feign客户端，用于远程调用客户信息服务
    @Resource
    private CustomerInfoFeignClient customerInfoFeignClient;

    // 注入Redis模板，用于操作Redis数据库
    @Resource
    private RedisTemplate redisTemplate;

    /**
     * 用户登录方法
     *
     * @param code 登录码（可能是微信授权码或其他认证码）
     * @return 返回生成的登录token
     * @throws PowerException 当登录失败时抛出业务异常
     */
    @Override
    public String login(String code) {
        // 通过Feign客户端调用远程登录接口，获取登录结果
        Result<Long> result = customerInfoFeignClient.login(code);

        // 检查接口返回状态码，如果不是200表示登录失败
        if (result.getCode().intValue() != 200) {
            // 抛出业务异常，包含错误码和错误信息
            throw new PowerException(result.getCode(), result.getMessage());
        }

        // 从返回结果中提取用户ID
        Long customerId = result.getData();
        // 生成UUID作为token，并移除其中的连字符
        String token = UUID.randomUUID().toString().replaceAll("-", "");
        // 将token和用户ID存储到Redis中：
        // 1. 使用Redis常量前缀拼接token作为key
        // 2. 用户ID作为value
        // 3. 设置过期时间（单位：秒）
        // 4. 使用TimeUnit.SECONDS指定时间单位
        redisTemplate.opsForValue().set(
                RedisConstant.USER_LOGIN_KEY_PREFIX + token,
                customerId,
                RedisConstant.USER_LOGIN_KEY_TIMEOUT,
                java.util.concurrent.TimeUnit.SECONDS);

        // 返回生成的token给客户端，用于后续的身份验证
        return token;
    }

    /**
     * 获取客户登录信息
     * 通过Feign客户端调用远程服务获取指定客户的登录信息
     *
     * @param customerId 客户ID，用于查询对应的客户信息
     * @return 客户登录信息视图对象，包含客户的基本登录信息
     * @throws PowerException 当远程调用失败或返回非200状态码时抛出业务异常
     */
    @Override
    public CustomerLoginVo getCustomerLoginInfo(Long customerId) {
        // 通过Feign客户端调用远程服务，获取客户登录信息
        Result<CustomerLoginVo> customerLoginInfo = customerInfoFeignClient.getCustomerLoginInfo(customerId);

        // 检查远程调用返回的状态码，如果不是200表示调用失败
        if (customerLoginInfo.getCode().intValue() != 200) {
            // 抛出业务异常，包含错误码和错误信息
            throw new PowerException(customerLoginInfo.getCode(), customerLoginInfo.getMessage());
        }

        // 从返回结果中提取客户登录信息数据
        CustomerLoginVo customerLoginVo = customerLoginInfo.getData();
        // 返回客户登录信息视图对象
        return customerLoginVo;
    }

    /**
     * 更新客户手机号方法
     * 该方法用于处理客户手机号的更新请求，通过Feign客户端调用远程服务完成手机号更新操作
     *
     * @param updateWxPhoneForm 更新手机号表单对象
     * @return Boolean 返回操作结果，true表示手机号更新成功
     */
    @Override
    public Boolean updatePhone(UpdateWxPhoneForm updateWxPhoneForm) {
        // 通过Feign客户端调用远程服务的手机号更新接口
        customerInfoFeignClient.updateWxPhoneNumber(updateWxPhoneForm);
        // 返回操作成功状态
        return true;
    }
}